New Input System 完全に理解した
https://scrapbox.io/files/6142db5ce43ac5001dd966e7.png
理解していない範囲
Scriptからダイレクトに受け取り、処理する方法
1 座学編
1-1 InputSystemとは?
Unityの新しいInputSytemのこと。ゲームパッドなどの多種多様な入力に対応するために作られた。
イベントドリブン系のシステムを採用している。
1-2 実行環境について
InputSystemはinternalが終了したとはいえ、まだまだ新しい機能なので変更される可能性があります。そのためこの記事でのUnityのVersionは2020.3であることを明記しておきます。
もし、実行時にエラーが出た場合はUnity公式リファレンスを参考にしてください。
2 実践編
2-1 説明する範囲
Input Action Systemを利用し、GameObjectを動かす。GameObjectの動かし方はRigidBody、Velocityを直接変更する形を採用する。すべてを網羅して説明するわけではないので、気になる点は公式ドキュメントを参照すること。
2-2 キャラクタ操作までの手順
よく使うであろうキャラクタを操作する手順までを紹介しながらInputSystemについて理解を深めよう
2-3 Input Actionの作成
Project -> 右クリック -> Input Action から InputActonを作成する
https://scrapbox.io/files/6142db2dc5a889001d13c043.png
2-4 input action の画面構成
https://scrapbox.io/files/6142db84c1975d001d976101.png
inputactionを作成すると上記の画面がポップアップします。左からActionMap, Action, Propertiesと呼び、ActionMapはPlayerやVehicleなどコントロールされるオブジェクトの状態を表します。ActionはShoot, Movementなどの動作を表します。Propertiesは上述した要素のプロパティを表示します。
2-5 ActionMap, Actionの作成
Input Actionの画面構成を理解したので、実際に登録していきましょう。ActionMapの右の+マークをクリックすると新しいActionMapが作成されます。名前はダブルクリックで変更でき、自由に変更して構いません。しかし、後からScriptで呼び出すときに、このActionMap名を指定することになりますので、その点を留意してください。ActionMapを作成すると自動的にActionも作成されます。さらに右上の+マークを押すことでActionを追加することができます。Action名もActionMapと同じく名前を自由に変更して構いません。(参考 : 今回はActionMapをPlayer, ActionをShoot, Movementにしました。)
https://scrapbox.io/files/6142dcab3a44210023b13317.png
2-6 ActionへのBinding
BindingとはActionへキーなどの入力を結びつけることです。Actionの右側の+マークからAdd Bindingを選択するとBindingが作成されます。
https://scrapbox.io/files/6142de50acb721001f949e8e.png
BindingのPathからキー入力を自由にBindingしてください。この時Listenボタンをクリックしキーを入力するとそのキーが何キーか表示されるので素早くBindingが行えます。
https://scrapbox.io/files/6142de657061790023f5bb8b.png
Vector2入力を受け取る
旧Horizontal, Veticalを受け取りましょう。この2つは2軸なので2軸用の設定に変える必要があります。
Actions(緑)のActionTypeをValue, Control TypeをVector2に変更します。
https://scrapbox.io/files/6147097b9cf806001fefca09.png
ActionからAdd 2D Vector Compositeを選択して、2Dvector用のbindingを作成しましょう
[https://scrapbox.io/files/614709b2981fd3001dd171df.png:
これらにキーをBindingしたら完了です。
https://scrapbox.io/files/614709e7e8b3b2001dfb1101.png
スキーマを作成する
https://scrapbox.io/files/61470a10fa7cb700204fe5b0.png
左上(keyboard and mouse)からスキーマを作成することができます。
スキーマとはいわゆるプリセットのようなもので、keyboard用、gamepad用などを作成し、スキーマによって所属するbinidingを変えたりできます。
右のUse in control scheme のチェックボックスで所属するスキーマを変更できます。
https://scrapbox.io/files/61470a8d981fd3001dd1770c.png
InputAction完成
これにて基本的なActionのBindingとWASDについて学びました。
[https://scrapbox.io/files/6142e180d8258f002312ee99.png[]
スクリプトから拾う
InputActionをScriptから拾いましょう。
newからインスタンスを作成してInputActionを扱いたいので、InputActionからC#スクリプトを作成します。
キャラクタ移動を実装する
コードリファレンス
code:player.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class player : MonoBehaviour
{
PlayerController controls = null;
Rigidbody _rigidbody = null;
float speed = 10.0f;
void Awake()
{
controls = new PlayerController();
//Input Action インスタンスを作成
controls.Player.Shoot.performed += ctx => Shoot();
//+=は呼び出されたとき~のシンタックス
controls.Player.Movement.performed += ctx => Move(ctx.ReadValue<Vector2>());
//ctxに呼び出されたときのメッセージが格納される
_rigidbody = GetComponent<Rigidbody>();
}
void Shoot()
{
Debug.Log("Shooot!!");
}
void Move(Vector2 direction)
{
Debug.Log("Moving..." + direction);
_rigidbody.velocity = new Vector3(direction.x, 0, direction.y) * speed;
}
private void OnEnable()
{
controls.Enable();
}
private void OnDisable()
{
controls.Disable();
}
}
ex. 参考文献
ゲームパッド用 (内容が新しいのでこちらをお勧めする)
https://www.youtube.com/watch?v=p-3S73MaDP8
キーボード(仕様が古いため2020環境ではうまくいかないので注意)
https://www.youtube.com/watch?v=Pzd8NhcRzVo
スクリプト
公式マニュアル